Function 키워드와 내부 프로퍼티
실행 환경을 설정하는 시점은
- 엔진이 function 키워드를 만나 function object를 생성할 때다. 이때 설정하는 것은 함수가 속한 스코프(실행 영역 - 즉 Lexical Scope)
- 엔진이 function 키워드를 만났을 때 코드가 실행되는 것이 아니다. function 키워드를 만나고 한참 후에나 실제 사용을 하게 되므로 function 오브젝트를 저장해둬야 한다.
어디에 저장하는가?
생성한 function 오브젝트에 저장한다. 생성한 function object 안에 함수가 실행될 수 있는 환경이 담겨있는 것이다. 그냥 프로퍼티로 담는 것이 아니라, function object의 **"내부 프로퍼티"**에 {name:value} 형태로 실행 환경을 저장한다.
내부 프로퍼티
내부 프로퍼티란 엔진이 내부 처리에 사용하는 프로퍼티로, 외부에서 사용 불가능 하다. 즉, 개발자가 접근할 수 없는 프로퍼티다. 이러한 내부 프로퍼티는 [[Scope]] : {}
와 같은 형태로 저장된다. 로 저장됨
내부 프로퍼티는 "공통 프로퍼티"와 "선택적 프로퍼티"로 나뉜다.
- 공통 프로퍼티 :모든 오브젝트(JS built-in Object로 만드는 오브젝트)에 공통으로 설정되는 프로퍼티
- 선택적 프로퍼티 : 오브젝트에 따라 선택적으로 설정되는 프로퍼티
- Array Object에는 설정되지만 String Object에는 설정되지 않는 것들
공통 내부 프로퍼티
[[Prototype]]
값: Object 또는 Null- 모든 오브젝트라고 하지만, prototype을 가지지 않는 오브젝트도 있다. (예: Math Object)
[[Class]]
값: String- 오브젝트의 유형을 구분하는 내부 프로퍼티, 이걸로 오브젝트를 판별한다.
[[Extensible]]
값: Boolean- 오브젝트에 새로운 프로퍼티를 추가 가능한지 여부를 담고있다.
[[Get]]
값: any- 이름의 프로퍼티 값, getter라고 보면 된다.
[[GetOwnProperty]]
값: 프로퍼티 디스크립터[[GetProperty]]
값: 프로퍼티 디스크립터[[Put]]
- 프로퍼티 이름으로, 프로퍼티 값을 설정
[[CanPut]]
값: boolean- 값(value) 설정 가능 여부를 담고 있다.
[[HasProperty]]
값: boolean- 프로퍼티의 존재 여부를 담는다.
[[Delete]]
값: boolean- 오브젝트에서 프로퍼티 삭제 가능 여부를 담는다.
[[DefaultValue]]
값: any- 오브젝트의 디폴트 값을 담고 있다.
[[DefinedOwnProperty]]
- 프로퍼티 추가, 프로퍼티 값 변경 가능 여부를 담는다.
프로퍼티 디스크립터(propertyDescriptor)라는 객체에 대해 더 알아봐야 될 듯
선택적 내부 프로퍼티
오브젝트에 따라 선택적으로 설정되는 내부 프로퍼티다.
[[PrimitiveValue]]
값: primitive 값- Boolean, Date, Number, String 오브젝트에서만 설정됨
- 개발자 도구로 확인할 수 있는 내부 프로퍼티 중 첫번째
[[Construct]]
값: Objectnew
연산자로 호출되며 인스턴스를 생성한다. Math 객체는 Constructor가 없어서 인스턴스를 생성하지 못하지만, 대부분의 객체는 생성자를 가지고 있으므로 인스턴스를 생성할 수 있다.
[[Call]]
값: any- 함수 호출
[[HasInstance]]
값: Boolean- 지정한 오브젝트로 생성한 인스턴스인지 확인하기 위해 사용한다.
instanceof
키워드라 생각하면 된다.
[[Scope]]
값: lexical enviroment- Function Object가 들고 있는 내부프로퍼티
- Function 키워드를 만나면 엔진이 Function Object를 만들 때, Function Object가 실행되는 렉시컬(정적) 환경이 설정되는 공간이다.
- 개발자 도구로 확인할 수 있는 내부 프로퍼티 중 두번째
[[FormalParameters]]
값: 문자열 리스트- 호출된 함수의 파라미터 이름 리스트를 담고 있다.
[[Code]]
값: JS 코드- Function Object를 만들 때, 여기에다가 코드를 저장하게 된다.
- 함수에 작성한 JS 코드가 저장되고, 함수가 호출되었을 때 여기 담긴 것을 해석하고 실행한다.
[[TargetFunction]]
값: Objectbind()
메소드에서 사용- Function Object의 bind()에, 새로 생성한 타깃 함수 오브젝트를 설정
[[BoundThis]]
값: anybind()
메소드에서 사용- bind()에 바인딩된 this 오브젝트가 설정된다.(bind메소드의 첫번째 인자가 저장됨)
[[BoundArguments]]
값: Listbind()
메소드에서 사용- bind()에 바인딩된 argument list가 설장된다(bind 메소드의 두번째 인자가 저장됨)
[[Match]]
값: 매치 결과- built-in 정규표현식 객체에 쓰인다.
- 정규표현식의 매치 결과가 담긴다.
[[ParameterMap]]
값: Object- argument objetc와 함수의 파라미터를 매핑